﻿using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Diagnostics;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Windows.Forms;
using _1.Presentacion.Principal;
using _1.Presentacion.Utilidades;
using _2.Logica.Finanzas;
using _4.Modelado;
using _4.Modelado.Finanzas;
using Microsoft.VisualBasic;

namespace _1.Presentacion.Modulo_Finanzas
{
    public partial class frm_IngresoEgreso : Päntalla_Base
    {
        public frm_IngresoEgreso()
        {
            InitializeComponent();
        }

        private void frm_IngresoEgreso_Load(object sender, EventArgs e)
        {
            CargaComboTipoMovimiento();
            CargaGridEncabezado();
        }

        #region Metodos

        #region Encabezado
        private void CargaGridEncabezado()
        {
            try
            {
                var logica = new EncIngresoEgresoL();

                List<EncIngresoEgreso> listaDetalle = logica.Enc_MovimientoConsultar();
                //Recorre la lista de Usuarios para asignar a cada celda del Datagrid
                //Los valores devueltos por la consulta
                dgv_EncMovimiento.Rows.Clear();
                for (int i = 0; i < listaDetalle.Count; i++)
                {
                    dgv_EncMovimiento.Rows.Add();
                    dgv_EncMovimiento.Rows[i].Cells[0].Value = listaDetalle[i].iPK_EncMovimiento;
                    dgv_EncMovimiento.Rows[i].Cells[1].Value = listaDetalle[i].sFK_TipoMovimiento;
                    dgv_EncMovimiento.Rows[i].Cells[2].Value = listaDetalle[i].iFK_UsuarioEncMov;
                    dgv_EncMovimiento.Rows[i].Cells[3].Value = listaDetalle[i].dtEncMov_Fecha;
                    dgv_EncMovimiento.Rows[i].Cells[4].Value = listaDetalle[i].sEncObservaciones;
                    dgv_EncMovimiento.Rows[i].Cells[5].Value = listaDetalle[i].sUsLogin;
                }

            }
            catch (Exception exc)
            {

                MessageBox.Show("Eror al cargar la lista de encabezados " + exc, "Error", MessageBoxButtons.OK, MessageBoxIcon.Error);
            }

        }

        private void CargaComboTipoMovimiento()
        {
            try
            {
                var logica = new RazonMovimientoL();

                cbTipoMovimiento.DataSource = logica.LlenarComboIEMovimiento();
                cbTipoMovimiento.ValueMember = "PK_Tipo_Movimiento";
                cbTipoMovimiento.DisplayMember = "TipoMovimientoNombre";
            }
            catch (Exception exc)
            {

                MessageBox.Show("Eror al cargar información " + exc, "Error", MessageBoxButtons.OKCancel);
            }
        }

        private void LimpiarEncabezado()
        {
            cbTipoMovimiento.Focus();
            txt_PKEncMovimiento.Text = "0";
            txtObservaciones.Text = string.Empty;
            CargaComboTipoMovimiento();
            dtFechaEnc.Value = DateTime.Today;

        }

        #endregion

        #region Detalle
        private void CargaGridDetalle()
        {
            try
            {
                var logica = new DetIngresoEgresoL();

                List<DetIngresoEgreso> listaDetalle = logica.Det_MovimientoConsultar(Convert.ToInt32(txt_PKEncMovimiento.Text));
                //Recorre la lista de Usuarios para asignar a cada celda del Datagrid
                //Los valores devueltos por la consulta
                dgDetalle.Rows.Clear();
                for (int i = 0; i < listaDetalle.Count; i++)
                {
                    dgDetalle.Rows.Add();
                    dgDetalle.Rows[i].Cells[0].Value = listaDetalle[i].iPK_DetMovimiento;
                    dgDetalle.Rows[i].Cells[1].Value = listaDetalle[i].iFK_EncMovimento;
                    dgDetalle.Rows[i].Cells[2].Value = listaDetalle[i].iFK_RazonMovimiento;
                    dgDetalle.Rows[i].Cells[3].Value = listaDetalle[i].sRazonMovimiento;
                    dgDetalle.Rows[i].Cells[4].Value = listaDetalle[i].dcDetMov_Monto;
                    dgDetalle.Rows[i].Cells[5].Value = listaDetalle[i].sDetMov_RefInterna;
                    dgDetalle.Rows[i].Cells[6].Value = listaDetalle[i].sDetMov_RefExterna;
                    dgDetalle.Rows[i].Cells[7].Value = listaDetalle[i].sDetMov_Observacion;
                       
                }

            }
            catch (Exception exc)
            {

                MessageBox.Show("Eror al cargar la lista de detalles " + exc, "Error", MessageBoxButtons.OK, MessageBoxIcon.Error);
            }

        }

        private void CargaComboRazon_PorMovimiento()
        {
            try
            {
                var logica = new RazonMovimientoL();

                cb_TipoRazon.DataSource = logica.LlenarComboRazon_PorMovimiento(cbTipoMovimiento.SelectedValue.ToString());
                cb_TipoRazon.ValueMember = "PK_RazonMovimiento";
                cb_TipoRazon.DisplayMember = "RazonMovDescripcion";
            }
            catch (Exception exc)
            {

                MessageBox.Show("Eror al cargar información " + exc, "Error", MessageBoxButtons.OKCancel);
            }
        }

        private void LimpiarDetalle()
        {
            cb_TipoRazon.Focus();
            txt_PKDetMovimiento.Text = "0";
            txtMonto.Text = string.Empty;
            txtRefInterna.Text = string.Empty;
            txtRefExterna.Text = string.Empty;
            txtDetObservaciones.Text = string.Empty;
            CargaComboRazon_PorMovimiento();
           

        }

        #endregion

        #endregion

        #region Encabezado


        private void btnGuardar_Click(object sender, EventArgs e)
        {
            try
            {
                var obj = new EncIngresoEgreso();
                obj.iPK_EncMovimiento = Convert.ToInt32(txt_PKEncMovimiento.Text);
                obj.sFK_TipoMovimiento = (cbTipoMovimiento.SelectedValue).ToString();
                obj.sEncObservaciones = txtObservaciones.Text;
                obj.iFK_UsuarioEncMov = VariableGlobales.iCodigoUsuario;
                obj.dtEncMov_Fecha = dtFechaEnc.Value;




                var logica = new EncIngresoEgresoL();

                logica.Enc_MovimientoGuardar(obj);
                CargaGridEncabezado();
                MessageBox.Show("El registro fue almacenado exitósamente", "Transacción", MessageBoxButtons.OK, MessageBoxIcon.Information);

                LimpiarEncabezado();
            }
            catch (Exception exc)
            {
                MessageBox.Show("Se produjo un error al guardar los datos" + exc, "Error", MessageBoxButtons.OKCancel);
            }
        }

        private void btnNuevoIngreso_Click(object sender, EventArgs e)
        {
            LimpiarEncabezado();
        }

        #endregion





        #region Navegacion

        #region Encabezado

        private void cbTipoMovimiento_KeyDown(object sender, KeyEventArgs e)
        {
            if (e.KeyCode == Keys.Enter)
            {
                dtFechaEnc.Focus();
            }
        }

        private void dtFechaEnc_KeyDown(object sender, KeyEventArgs e)
        {
            if (e.KeyCode == Keys.Enter)
            {
                txtObservaciones.Focus();
            }
        }

        private void txtObservaciones_KeyDown(object sender, KeyEventArgs e)
        {

            if (e.KeyCode == Keys.Enter)
            {
                btnGuardar_Click(sender, e);
            }

        }


        #endregion

        private void button1_Click(object sender, EventArgs e)
        {
            try
            {
                if (dgv_EncMovimiento.RowCount > 0)
                {
                    int indiceFila = dgv_EncMovimiento.SelectedCells[0].RowIndex;
                    string sDescripcion = dgv_EncMovimiento[3, indiceFila].Value.ToString();

                    #region Elimina encabezado

                    DialogResult r = MessageBox.Show("Desea eliminar el encabezado: " + sDescripcion, "Validaciones",
                                                     MessageBoxButtons.OKCancel, MessageBoxIcon.Question);

                    if (r == DialogResult.OK)
                    {

                        var obj = new EncIngresoEgreso();
                        obj.iPK_EncMovimiento = Convert.ToInt32(dgv_EncMovimiento.Rows[indiceFila].Cells[0].Value);


                        var logica = new EncIngresoEgresoL();
                        logica.Enc_MovimientoEliminar(obj);
                        CargaGridEncabezado();
                        MessageBox.Show("El registro se ha eliminado exitósamente", "Transacción", MessageBoxButtons.OK, MessageBoxIcon.Information);
                        LimpiarEncabezado();



                    }


                    #endregion
                }


            }
            catch (Exception exc)
            {

                if (exc.Message.Contains("The DELETE statement conflicted with the REFERENCE constraint"))
                {
                    MessageBox.Show("El registro tiene datos asosciados, asegúrese de que no tenga datos", "Error", MessageBoxButtons.OK, MessageBoxIcon.Error);
                }
                else
                {
                    MessageBox.Show("No se pudo eliminar el registro " + exc, "Error", MessageBoxButtons.OKCancel, MessageBoxIcon.Error);
                }
            }
        }

        #endregion

        private void textBox1_KeyDown(object sender, KeyEventArgs e)
        {
            if (e.KeyCode == Keys.Enter)
            {
                try
                {
                    if (txt_PKEncMovimiento.Text != "0")
                    {

                        #region Guarda Detalle

                        if (Information.IsNumeric(txtMonto.Text))
                        {
                            var obj = new DetIngresoEgreso();


                            obj.iPK_DetMovimiento = Convert.ToInt32(txt_PKDetMovimiento.Text);
                            obj.iFK_EncMovimento = Convert.ToInt32(txt_PKEncMovimiento.Text);
                            obj.iFK_RazonMovimiento = Convert.ToInt32(cb_TipoRazon.SelectedValue);
                            obj.dcDetMov_Monto = Convert.ToDecimal(txtMonto.Text);
                            obj.sDetMov_RefInterna = txtRefInterna.Text;
                            obj.sDetMov_RefExterna = txtRefExterna.Text;
                            obj.sDetMov_Observacion = txtDetObservaciones.Text;



                            var logica = new DetIngresoEgresoL();

                            logica.Det_MovimientoGuardar(obj);
                            CargaGridDetalle();
                            MessageBox.Show("El registro fue almacenado exitósamente", "Transacción",
                                            MessageBoxButtons.OK, MessageBoxIcon.Information);
                            LimpiarDetalle();
                        }
                        else
                        {
                            MessageBox.Show("Debe ingresar una cantidad válida", "Error", MessageBoxButtons.OK,
                                            MessageBoxIcon.Warning);
                            txtMonto.Focus();
                            txtMonto.Clear();
                        }

                        #endregion


                    }
                    else
                    {
                        MessageBox.Show("Debe seleccionar un encabezado", "Error", MessageBoxButtons.OK,
                                        MessageBoxIcon.Warning);

                    }

                }
                catch (Exception exc)
                {

                    MessageBox.Show("Se produjo un error " + exc, "Error", MessageBoxButtons.OK, MessageBoxIcon.Error);
                }
             }
        }

        private void btnEliminarIngreso_Click(object sender, EventArgs e)
        {
            try
            {
                if (dgDetalle.RowCount > 0)
                {
                    int indiceFila = dgDetalle.SelectedCells[0].RowIndex;
                    string sDescripcion = dgDetalle[3, indiceFila].Value.ToString();

                    #region Elimina detalle

                    DialogResult r = MessageBox.Show("Desea eliminar el detalle: " + sDescripcion, "Validaciones",
                                                     MessageBoxButtons.OKCancel, MessageBoxIcon.Question);

                    if (r == DialogResult.OK)
                    {

                        var obj = new DetIngresoEgreso();
                        obj.iPK_DetMovimiento = Convert.ToInt32(dgv_EncMovimiento.Rows[indiceFila].Cells[0].Value);


                        var logica = new DetIngresoEgresoL();
                        logica.Det_MovimientoEliminar(obj);
                        CargaGridEncabezado();
                        MessageBox.Show("El registro se ha eliminado exitósamente", "Transacción", MessageBoxButtons.OK, MessageBoxIcon.Information);
                        LimpiarEncabezado();



                    }


                    #endregion
                }


            }
            catch (Exception exc)
            {

                if (exc.Message.Contains("The DELETE statement conflicted with the REFERENCE constraint"))
                {
                    MessageBox.Show("El registro tiene datos asosciados, asegúrese de que no tenga datos", "Error", MessageBoxButtons.OK, MessageBoxIcon.Error);
                }
                else
                {
                    MessageBox.Show("No se pudo eliminar el registro " + exc, "Error", MessageBoxButtons.OKCancel, MessageBoxIcon.Error);
                }
            }
        }

        private void dgv_EncMovimiento_CellDoubleClick(object sender, DataGridViewCellEventArgs e)
        {

            int indicefila = dgv_EncMovimiento.SelectedCells[0].RowIndex;
            txt_PKEncMovimiento.Text = dgv_EncMovimiento.Rows[indicefila].Cells[0].Value.ToString();
            cbTipoMovimiento.SelectedValue = dgv_EncMovimiento.Rows[indicefila].Cells[1].Value.ToString();
            dtFechaEnc.Value = Convert.ToDateTime(dgv_EncMovimiento.Rows[indicefila].Cells[3].Value.ToString());
            txtObservaciones.Text = dgv_EncMovimiento.Rows[indicefila].Cells[4].Value.ToString();
      
            
            
            
            gbDetalle.Enabled = true;
            CargaGridDetalle();
            CargaComboRazon_PorMovimiento();
        }

        private void cbTipoMovimiento_SelectedIndexChanged(object sender, EventArgs e)
        {
            CargaGridEncabezado();
        }

        private void button2_Click(object sender, EventArgs e)
        {


            Process.Start("Calc.exe");
        }

    }
    }
